package edu.upc.dao.consulta.impl;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import edu.upc.dao.consulta.ConsultaSolicitanteDao;
import edu.upc.model.ExperienciaProfesional;
import edu.upc.model.Industria;
import edu.upc.model.PerfilProfesional;
import edu.upc.model.Solicitante;

@Component
public class ConsultaSolicitanteDaoImpl implements ConsultaSolicitanteDao {

	@Autowired
	private DataSource dataSource;
	
	public List<Solicitante> obtenerSolicitantePorIndustria(Industria industria) {
		String sql = "SELECT id_per,email_per,password_per,titulo_per,resumen_per,disponibilidad_per,salario_per,nombreRazonSocial_per,apellidoPaterno_per,apellidoMaterno_per,direccion_per,numeroDocumento_per,sexo_per,fechaNacimiento_per,telefono_per,celular_per,id_tipper,id_tipusu,id_dis,id_tipdoc FROM tb_persona p, tb_experiencia_laboral e WHERE p.id_per = e.id_per AND e.id_ind <= ?";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<Solicitante> lst = new ArrayList<Solicitante>();
		try {
			conn = dataSource.getConnection();
			ps = conn.prepareStatement(sql);
			ps.setInt(1, industria.getIdIndustria());
			rs = ps.executeQuery();
			lst = mapResult(rs);
		} catch (SQLException e) {
			throw new RuntimeException("SQL exception occurred finding noti by Ofertante", e);
		} finally {
			if (rs != null) {
				try {
					rs.close();
				} catch (SQLException ex) {
				}
			}
			if (ps != null) {
				try {
					ps.close();
				} catch (SQLException ex) {
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException ex) {
				}
			}
		}
		return lst;
	}

	public List<Solicitante> obtenerSolicitantePorAnhiosExperiencia(int anhio) {
		String sql = "SELECT p.id_per,p.email_per,p.password_per,p.titulo_per,p.resumen_per,p.disponibilidad_per,p.salario_per,p.nombreRazonSocial_per,p.apellidoPaterno_per,p.apellidoMaterno_per,p.direccion_per,p.numeroDocumento_per,p.sexo_per,p.fechaNacimiento_per,p.telefono_per,p.celular_per,p.id_tipper,p.id_tipusu,p.id_dis,p.id_tipdoc FROM tb_persona p, tb_experiencia_laboral e WHERE p.id_per = e.id_per AND e.fechaInicio_exp <= ?";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<Solicitante> lst = new ArrayList<Solicitante>();
		try {
			conn = dataSource.getConnection();
			ps = conn.prepareStatement(sql);
			Calendar cal = Calendar.getInstance();
			cal.set(anhio, 0, 1);
			ps.setDate(1, new Date(cal.getTimeInMillis()));
			rs = ps.executeQuery();
			lst = mapResult(rs);
		} catch (SQLException e) {
			throw new RuntimeException("SQL exception occurred finding noti by Ofertante", e);
		} finally {
			if (rs != null) {
				try {
					rs.close();
				} catch (SQLException ex) {
				}
			}
			if (ps != null) {
				try {
					ps.close();
				} catch (SQLException ex) {
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException ex) {
				}
			}
		}
		return lst;
	}
	
	private List<Solicitante> mapResult(ResultSet rs) throws SQLException {
		List<Solicitante> lstSolicitante=new ArrayList<Solicitante>();
		while(rs.next()){
			Solicitante solicitante = new Solicitante();
			solicitante.setId(rs.getInt("id_per"));
			solicitante.setCorreo(rs.getString("email_per"));
			PerfilProfesional perfil = new PerfilProfesional();
			perfil.setTituloProfesional(rs.getString("titulo_per"));
			perfil.setResumenProfesional(rs.getString("resumen_per"));
			perfil.setDisponibilidadHoraria(rs.getString("disponibilidad_per"));
			perfil.setPretencionEconomica(new BigDecimal(rs.getString("salario_per")));
			
			solicitante.setPerfilProfesional(perfil);
			solicitante.setNombre(rs.getString("nombreRazonSocial_per"));
			solicitante.setApellidoPaterno(rs.getString("apellidoPaterno_per"));
			solicitante.setApellidoMaterno(rs.getString("apellidoMaterno_per"));
			solicitante.setDireccion(rs.getString("direccion_per"));
			solicitante.setNumeroDocumento(rs.getString("numeroDocumento_per"));
			solicitante.setSexo(rs.getString("sexo_per"));
			
			solicitante.setFechaNacimiento(rs.getDate("fechaNacimiento_per"));
			solicitante.setTelefono(rs.getString("telefono_per"));
			solicitante.setCelular(rs.getString("celular_per"));
			solicitante.setTipoPersona(rs.getString("id_tipper"));
			solicitante.setTipoDocumento(rs.getString("id_tipdoc"));
			solicitante.setListExperienciaProfesional(obtenerExperienciaPorSolicitante(solicitante));
			lstSolicitante.add(solicitante);
		}

		return lstSolicitante;
	}
	
	private List<ExperienciaProfesional> obtenerExperienciaPorSolicitante(Solicitante solicitante) {
		String sql = "SELECT e.nombreEmpresa_exp,e.cargo_exp,e.fechaInicio_exp,e.fechaFin_exp,e.descripcion_exp,e.id_per,e.id_ind,i.descripcion_ind FROM tb_experiencia_laboral e, tb_industria i WHERE e.id_ind = i.id_ind AND e.id_per = ?";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<ExperienciaProfesional> lst = new ArrayList<ExperienciaProfesional>();
		try {
			conn = dataSource.getConnection();
			ps = conn.prepareStatement(sql);
			ps.setInt(1, solicitante.getId());
			rs = ps.executeQuery();
			while(rs.next()){
				ExperienciaProfesional e = new ExperienciaProfesional();
				e.setNombreOrganizacion(rs.getString("nombreEmpresa_exp"));
				e.setCargo(rs.getString("cargo_exp"));
				e.setFechaInicio(rs.getDate("fechaInicio_exp"));
				e.setFechatermino(rs.getDate("fechaFin_exp"));
				e.setDescripcionLaboral(rs.getString("descripcion_exp"));
				Industria i = new Industria();
				i.setIdIndustria(rs.getInt("id_ind"));
				i.setNombreIndustria(rs.getString("descripcion_ind"));
				e.setIndustria(i);
				lst.add(e);
			}
		} catch (SQLException e) {
			throw new RuntimeException("SQL exception occurred finding noti by Ofertante", e);
		} finally {
			if (rs != null) {
				try {
					rs.close();
				} catch (SQLException ex) {
				}
			}
			if (ps != null) {
				try {
					ps.close();
				} catch (SQLException ex) {
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException ex) {
				}
			}
		}
		return lst;
	}

}
